package postgres

import (
	"context"
	"errors"
	"quipus/internal/database/model"
	apb "quipus/proto/gen/assist"

	_ "github.com/jackc/pgx/v5/stdlib"
	_ "github.com/joho/godotenv/autoload"
)

func (p *PGDB) GetIdentityProviderById(ctx context.Context, id int32) (*model.Idp, error) {
	p.query()
	idp := q.WithContext(ctx).Idp
	return idp.Where(q.Idp.ID.Eq(id)).First()
}

func (p *PGDB) GetIdentityProviderByType(ctx context.Context, idpType string, tenantId int32) (*model.Idp, error) {
	p.query()
	idp := q.WithContext(ctx).Idp
	return idp.Where(q.Idp.Type.Eq(idpType)).Where(q.Idp.TenantID.Eq(tenantId)).First()
}

func (p *PGDB) CreateIdentityProvider(ctx context.Context, create *model.Idp) error {
	p.query()
	idp := q.WithContext(ctx).Idp
	e := idp.Create(create)
	if e != nil {
		return e
	}
	return nil
}

func (p *PGDB) ListIdentityProviders(ctx context.Context, find *apb.FindIdentityProvider) ([]*model.Idp, error) {
	p.query()
	idp := q.WithContext(ctx).Idp

	if find == nil {
		return idp.Find()
	}

	if find.Id != 0 {
		idp.Where(q.Idp.ID.Eq(find.Id))
	}
	return idp.Find()
}

func (p *PGDB) UpdateIdentityProvider(ctx context.Context, update *apb.UpdateIdentityProvider) (*model.Idp, error) {
	p.query()
	if update == nil {
		return nil, nil
	}

	updateValue := &model.Idp{}
	if update.Id == 0 {
		return nil, errors.New("id is null")
	}
	updateValue.ID = update.Id

	if len(update.Name) > 0 {
		updateValue.Name = update.Name
	}

	if update.Type != 0 {
		updateValue.Type = update.Type.String()
	}

	if len(update.IdentifierFilter) > 0 {
		updateValue.IdentifierFilter = update.IdentifierFilter
	}

	if update.Config != "" {
		updateValue.Config = update.Config
	}

	idp := q.WithContext(ctx).Idp
	_, e := idp.Updates(updateValue)
	if e != nil {
		return nil, e
	}
	return updateValue, nil
}

func (p *PGDB) DeleteIdentityProvider(ctx context.Context, id int32) error {
	p.query()
	idp := q.WithContext(ctx).Idp
	_, e := idp.Where(q.Idp.ID.Eq(id)).Delete()
	return e
}
